#include "my_ntc_app.h"
#include "my_battery.h"
#include "math.h"
#include "sys_param.h"

NTC_PARAM_t ntc_data;

/***********y***************************************************************************
* FunctionName   : Get_Temp()
* Description    :
*               Rt ： 当前的电阻值，（欧姆为单位）
*               Rp ： 25°C时电阻值如10k时（10000）（欧姆为单位）
*               Bx ： b值 如（3380）
* EntryParameter :
* Description    : --
* ReturnValue    :
**************************************************************************************/
const float Ka = 273.15;
const float T2 = (273.15 + 25.0);//T2

float Get_Temp(float Rt, float Rp, float Bx)
{
    float temp;
    temp = Rt / Rp;
    temp = log(temp);
    temp /= Bx;
    temp += (1/T2);
    temp = 1/(temp);
    temp -= Ka;
    return temp;
}

/*************************************************************************************
* FunctionName   : 电阻特性：3.3v --10k ---NTC--GND
* Description    :  2.5V --4096(2.5v稳压二极管，adc基准)
* EntryParameter :
* ReturnValue    : None
**************************************************************************************/
static float ntc_resistance(int adc_val)
{
    int ret;
    int tmp;

    // 1. 当前测试点的实际电压 当adc基准电压实际为3.0v时
    tmp = adc_val * 3000 / 4096; //单位是mV

    // 2. 当前电阻
    // 3300/（10000 +r)） = tmp/ r)
    ret = 10000 * tmp / (3000 - tmp);
    return ret;
}



static void my_ntc_read(void)
{
	static int printf_delay_cnt = 0;
    int tmp_adc_val;

#if 0
    if(ntc_data.index >= ADC_BUFF_MAX_CNT){
        ntc_data.index = 0; 

        bubble_sort(ntc_data.ntc1_adc_buff, ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc2_adc_buff, ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc3_adc_buff, ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc4_adc_buff, ADC_BUFF_MAX_CNT); 

        if(printf_delay_cnt ++ > 10)
        {
            printf_delay_cnt = 0;
            tmp_adc_val = ntc_data.ntc1_adc_buff[ADC_BUFF_MAX_CNT/2];
            printf("ntc1_adc :%d\r\n", tmp_adc_val);

            tmp_adc_val = ntc_data.ntc2_adc_buff[ADC_BUFF_MAX_CNT/2];
            printf("ntc2_adc :%d\r\n", tmp_adc_val);

            tmp_adc_val = ntc_data.ntc3_adc_buff[ADC_BUFF_MAX_CNT/2];
            printf("ntc3_adc :%d\r\n", tmp_adc_val);

            tmp_adc_val = ntc_data.ntc4_adc_buff[ADC_BUFF_MAX_CNT/2];
            printf("ntc4_adc :%d\r\n", tmp_adc_val);
        }
    }

   ntc_data.ntc1_adc_buff[ntc_data.index] = my_NTC1_adc_read();
   ntc_data.ntc2_adc_buff[ntc_data.index] = my_NTC2_adc_read();
   ntc_data.ntc3_adc_buff[ntc_data.index] = my_NTC3_adc_read();
   ntc_data.ntc4_adc_buff[ntc_data.index] = my_NTC4_adc_read();
   ntc_data.index ++;

#else 
    if(ntc_data.index >= ADC_BUFF_MAX_CNT){
        ntc_data.index = 0; 

        bubble_sort(ntc_data.ntc_adc_buff[0], ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc_adc_buff[1], ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc_adc_buff[2], ADC_BUFF_MAX_CNT); 
        bubble_sort(ntc_data.ntc_adc_buff[3], ADC_BUFF_MAX_CNT); 

        printf_delay_cnt ++;
         
        tmp_adc_val = ntc_data.ntc_adc_buff[0][ADC_BUFF_MAX_CNT/2];
        ntc_data.ntc_res[0] = ntc_resistance(tmp_adc_val);
        ntc_data.ntc_temp[0] = Get_Temp(ntc_data.ntc_res[0], 10000, 3950);

        if(printf_delay_cnt > 2){
            // printf("ntc1_adc,temp:%f :%d\r\n", ntc_data.ntc_temp[0], tmp_adc_val);
        } 
    
        tmp_adc_val = ntc_data.ntc_adc_buff[1][ADC_BUFF_MAX_CNT/2];
        ntc_data.ntc_res[1] = ntc_resistance(tmp_adc_val);
        ntc_data.ntc_temp[1] = Get_Temp(ntc_data.ntc_res[1], 10000, 3950);

        if(printf_delay_cnt > 2){
            // printf("ntc2_adc :%d, temp:%f\r\n", tmp_adc_val, ntc_data.ntc_temp[1]);
        } 

        tmp_adc_val = ntc_data.ntc_adc_buff[2][ADC_BUFF_MAX_CNT/2];
        ntc_data.ntc_res[2] = ntc_resistance(tmp_adc_val);
        ntc_data.ntc_temp[2] = Get_Temp(ntc_data.ntc_res[2], 10000, 3950);
        if(printf_delay_cnt > 2){
            // printf("ntc3_adc :%d\r\n", tmp_adc_val);
        } 

        tmp_adc_val = ntc_data.ntc_adc_buff[3][ADC_BUFF_MAX_CNT/2];
        ntc_data.ntc_res[3] = ntc_resistance(tmp_adc_val);
        ntc_data.ntc_temp[3] = Get_Temp(ntc_data.ntc_res[3], 10000, 3950);

        if(printf_delay_cnt > 10){
            // printf("ntc4_adc :%d\r\n", tmp_adc_val);

             printf("ntc_temp:[%.2f]-[%.2f]-[%.2f]-[%.2f]\r\n", ntc_data.ntc_temp[0], ntc_data.ntc_temp[1], ntc_data.ntc_temp[2], ntc_data.ntc_temp[3]);
            printf_delay_cnt = 0;
        } 
    }
   ntc_data.ntc_adc_buff[0][ntc_data.index] = my_NTC1_adc_read();
   ntc_data.ntc_adc_buff[1][ntc_data.index] = my_NTC2_adc_read();
   ntc_data.ntc_adc_buff[2][ntc_data.index] = my_NTC3_adc_read();
   ntc_data.ntc_adc_buff[3][ntc_data.index] = my_NTC4_adc_read();
   ntc_data.index ++;
#endif


}




/*10ms扫描一次*/
void my_ntc_scanf(void)
{
  if ((sys_data.sta == SLEEP_STA) || (sys_data.sta == CHARGE_STA)|| (sys_data.sta == CHARGE_FINISH_STA))
	{
		return;
	}
   my_ntc_read();
    
}
